home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / 2924.ZIP / DMLXREF.ARC / KBD.IMP < prev    next >
Encoding:
Text File  |  1988-12-20  |  4.7 KB  |  185 lines

  1. TYPE
  2.   KbdStatusType = RECORD              { Keyboard shift status record   }
  3.     InsOn,
  4.     CapsLockOn,
  5.     NumLockOn,
  6.     ScrollLockOn,
  7.     PauseOn,
  8.     AltPressed,
  9.     CtrlPressed,
  10.     LeftShiftPressed,
  11.     RightShiftPressed,
  12.     InsPressed,
  13.     CapsPressed,
  14.     NumLockPressed,
  15.     ScrollLockPressed,
  16.     SysReqPressed      : BOOLEAN;
  17.     END;
  18.  
  19.   KbdBufSeqType = RECORD     { Keyboard buffer key-    }
  20.     KbdCh       : CHAR;      { stroke sequence is      }
  21.     KbdScanCode : BYTE;      { character followed by   }
  22.     END;
  23.  
  24.   KbdBufferType = RECORD     { Keyboard buffer         }
  25.     KbdHead   : INTEGER;     { Circular buffer start   }
  26.     KbdTail   : INTEGER;     { and end.                }
  27.     KbdBuffer : ARRAY [1..16] OF KbdBufSeqType;
  28.     END;
  29.  
  30. VAR
  31.   KbdStatus    : KbdStatusType;
  32.   KbdStatWrd   : WORD;
  33.  
  34. FUNCTION KbdGetStatus : WORD;
  35. VAR
  36.   StatusLoc : WORD ABSOLUTE $0040:$0017;
  37.   StatusWrd : WORD;
  38.  
  39. BEGIN
  40.   StatusWrd := SWAP (StatusLoc);      { 8086 stores "backwards" }
  41.   WITH KbdStatus DO BEGIN
  42.     InsOn             := ((StatusWrd and $8000) <> 0);
  43.     CapsLockOn        := ((StatusWrd and $4000) <> 0);
  44.     NumLockOn         := ((StatusWrd and $2000) <> 0);
  45.     ScrollLockOn      := ((StatusWrd and $1000) <> 0);
  46.     AltPressed        := ((StatusWrd and $0800) <> 0);
  47.     CtrlPressed       := ((StatusWrd and $0400) <> 0);
  48.     LeftShiftPressed  := ((StatusWrd and $0200) <> 0);
  49.     RightShiftPressed := ((StatusWrd and $0100) <> 0);
  50.     InsPressed        := ((StatusWrd and $0080) <> 0);
  51.     CapsPressed       := ((StatusWrd and $0040) <> 0);
  52.     NumLockPressed    := ((StatusWrd and $0020) <> 0);
  53.     ScrollLockPressed := ((StatusWrd and $0010) <> 0);
  54.     PauseOn           := ((StatusWrd and $0008) <> 0);
  55.     SysReqPressed     := ((StatusWrd and $0004) <> 0)
  56.     END;
  57.   KbdGetStatus := StatusWrd;
  58. END;
  59.  
  60. PROCEDURE KbdSetInsMode (InsMode : BOOLEAN);
  61. VAR
  62.   KbdStatLoc : WORD ABSOLUTE $0040:$0017;
  63. BEGIN
  64.   IF InsMode THEN KbdStatLoc := KbdStatLoc OR  $8000
  65.              ELSE KbdStatLoc := KbdStatLoc AND $7FFF;
  66. END;
  67.  
  68. PROCEDURE KbdSetCapsLock (CapsLock : BOOLEAN);
  69. VAR
  70.   KbdStatLoc : WORD ABSOLUTE $0040:$0017;
  71. BEGIN
  72.   IF CapsLock THEN KbdStatLoc := KbdStatLoc OR  $4000
  73.               ELSE KbdStatLoc := KbdStatLoc AND $BFFF;
  74. END;
  75.  
  76. PROCEDURE KbdSetNumLock (NumLock : BOOLEAN);
  77. VAR
  78.   KbdStatLoc : WORD ABSOLUTE $0040:$0017;
  79. BEGIN
  80.   IF NumLock THEN KbdStatLoc := KbdStatLoc OR  $2000
  81.              ELSE KbdStatLoc := KbdStatLoc AND $DFFF;
  82. END;
  83.  
  84. PROCEDURE KbdSetScrollLock (ScrollLock : BOOLEAN);
  85. VAR
  86.   KbdStatLoc : WORD ABSOLUTE $0040:$0017;
  87. BEGIN
  88.   IF ScrollLock THEN KbdStatLoc := KbdStatLoc OR  $1000
  89.                 ELSE KbdStatLoc := KbdStatLoc AND $EFFF;
  90. END;
  91.  
  92. FUNCTION KbdInsModeStatus : BOOLEAN;
  93. BEGIN
  94.   KbdStatWrd := KbdGetStatus;                  { fill in KbdStatus }
  95.   KbdInsModeStatus := KbdStatus.InsOn;
  96. END;
  97.  
  98. FUNCTION KbdCapsLockStatus : BOOLEAN;          
  99. BEGIN
  100.   KbdStatWrd := KbdGetStatus;                  { fill in KbdStatus }
  101.   KbdCapsLockStatus := KbdStatus.CapsLockOn;
  102. END;
  103.  
  104. FUNCTION KbdNumLockStatus : BOOLEAN;
  105. BEGIN
  106.   KbdStatWrd := KbdGetStatus;                  { fill in KbdStatus }
  107.   KbdNumLockStatus := KbdStatus.NumLockOn;
  108. END;
  109.  
  110. FUNCTION KbdScrollLockStatus : BOOLEAN;
  111. BEGIN
  112.   KbdStatWrd := KbdGetStatus;                  { fill in KbdStatus }
  113.   KbdScrollLockStatus := KbdStatus.ScrollLockOn;
  114. END;
  115.  
  116. PROCEDURE KbdClear;
  117.  
  118. VAR
  119.   DosReg : Registers;
  120.  
  121. BEGIN
  122.   WITH DosReg DO BEGIN
  123.     AX := $0C06;         { Function C making a call to 6  }
  124.     DX := $00FF;         { Return immediately, do not wait}
  125.     INTR (_DOS, DosReg);
  126.     END;
  127. END;
  128.  
  129. FUNCTION KbdNumValuesWaiting : WORD;
  130. VAR
  131.   KeyBuffer : KbdBufferType ABSOLUTE $0040:$001A;
  132.  
  133. BEGIN
  134.   WITH KeyBuffer DO BEGIN
  135.     IF KbdHead <= KbdTail THEN
  136.       KbdNumValuesWaiting := (KbdTail-KbdHead) DIV 2
  137.     ELSE
  138.       KbdNumValuesWaiting := ((60-KbdHead)+(KbdTail-28)) DIV 2;
  139.     END;
  140. END;
  141.  
  142. FUNCTION KbdInputValue : WORD;
  143. VAR
  144.   CBreakSave : BOOLEAN;
  145.   DosReg     : Registers;
  146.  
  147. BEGIN
  148.   {Using the below lines to wait for a keypressed is twice as fast
  149.    as simply waiting for BIOS call to wait for a keypressed! - Hail IBM! }
  150.  
  151.   CBreakSave := CheckBreak;
  152.   CheckBreak := FALSE;
  153.  
  154.   REPEAT
  155.     UNTIL KEYPRESSED;
  156.  
  157.   CheckBreak := CBreakSave;
  158.  
  159.   WITH DosReg DO BEGIN
  160.     AX := 0;
  161.     INTR (_KEYBD, DosReg);
  162.     IF AL = 0 THEN BEGIN
  163.       KbdInputValue := $0100 + AH;
  164.       KbdLastChar   := #0;
  165.       END
  166.     ELSE BEGIN
  167.       KbdInputValue := AL;
  168.       KbdLastChar   := CHR(AL);
  169.       END;
  170.     END;
  171. END;
  172.  
  173. FUNCTION KbdKeyWaiting : BOOLEAN;
  174.  
  175. VAR
  176.   DosReg : Registers;
  177.  
  178. BEGIN
  179.   WITH DosReg DO BEGIN
  180.     AH := 1;
  181.     INTR (_KeyBd, DosReg);
  182.     KbdKeyWaiting := ((FLAGS AND $0040) = 0);
  183.     END;
  184. END;
  185.